const { ADDRGETNETWORKPARAMS, promises } = require("dns");
const { name } = require("ejs");
const express = require("express")
const path = require('path');
const app = express()
const fs = require("fs/promises")
// 设置为一个数组模拟数据库.......


// const 不允许进行再次赋值,而let可以在其他作用域中进行赋值
let Users = require("./date/students.json")

// 进入模组,并且设置好ejs模组,同时默认路劲
// 第一个是名字
app.set("view engine", "ejs")
app.set("views", path.resolve(__dirname, "views"))
// 设置静态路劲
app.use(express.static(path.resolve(__dirname, "public")))
// 设置解析中间件
app.use(express.urlencoded())

app.get("/", (req, res) => {
})
app.get("/students", (req, res) => {
    res.render("students", { Users: Users })
})
/* 
    第一步获取我们拿到的数据
    第二步让我们的数据添加进我们的数据库中`````
    第三部让我们对页面进行重定向,以防止无限输入上一个表单的内容
    */
app.post("/add-students", (req, res) => {
    // 声明一个id数字,为数组中最后一个对象的id属性的数字+1,来达到我们想要的id数字排序效果
    // 优化:
    //  如果我们内容表中没有内容,进行判断,如果有值,我们执行 id+1 否则 直接为1
    const id = Users.at(-1) ? Users.at(-1).id + 1 : 1
    // 结构赋值
    const { name, age, gender, address } = req.body
    // 将获取的各个数值放到一个对象中,age利用隐性迭代转换为Number数值类型
    const newUser = {
        id: id,
        name, age: +age, gender, address
    }
    // 给我们的Users注入我们的要的数据
    Users.push(newUser)
    console.log(newUser);
    fs.writeFile(
        path.resolve(__dirname, "./date/students.json")
        // 将其数据转换为字符串
        , JSON.stringify(Users)
    ).then(() => {
        // 不报错的情况下进行重定向
        res.redirect("/students")
    }
    ).catch(() => { }
    )
    // 重定向
})
// 删除的超链接路由
/* 
    第一步把我们的路由先绑定好.
    第二步我们获取其ID
    第三步再利用ID去获取当前点击的数据是那条.再进行删除,使用数据中的filer方法对数据进行过滤.......再执行操作 
    第四步对我们date存储的数据进行修改
    第五步进行流程的优化

*/
app.get("/del_Users", (req, res) => {
    const id = +req.query.id
    Users = Users.filter((User) =>
        User.id !== id
    )

    fs.writeFile(
        path.resolve(__dirname, "./date/students.json")
        , JSON.stringify(Users)
    ).then(() => {
        res.redirect("/students")
    }
    ).catch(() => { }
    )
    console.log(Users);
    console.log("收到请求");
})
// 修改的超链接路由
/* 
    第一步设置其路由
    第二步先获取到我们需要修改的数据
    第三步,在我们的页面中输出我们的原数据,并且允许修改
    // find和filter方法的区别是,一个返回的是值,一个是我们数组的对象
    第四步,设置路由....分别赋值,更新其对应的数据
    */


app.get("/res_Users", (req, res) => {
    const id = +req.query.id
    const std = Users.find((User) =>
        User.id === id
    )
    console.log(std);
    res.render("std_res", { std })
    console.log("收到请求");
})
app.post(("/res_std"), (req, res) => {
    const { id, name, age, gender, address } = req.body
    const std = Users.find((User) =>
        User.id == id
    )
    std.name = name
    std.age = +age
    std.gender = gender
    std.address = address
    fs.writeFile(
        path.resolve(__dirname, "./date/students.json")
        , JSON.stringify(Users)
    ).then(() => {
        res.redirect("/students")
    }
    ).catch(() => { }
    )
    console.log("收到请求");
})
app.get("/set_name", (req, res) => {

    name = req.query.name
    res.send("修改成功")
})


app.use((req, res) => {
    res.status(404)
    res.send("<h1>你访问的网站出现问题了........<h1>")
})
app.listen(3000, () => {
    console.log("服务器已启动.....");
})